<?php
/**
 * 文件夹处理类
 * 
 * @version $Id: Dir.php 131 2011-04-12 09:54:31Z linsir123 $
 */
class lpDir
{
	/**
	 * 过滤目录
	 */
	static function setSafe($dir)
	{
		if (substr($dir, -1) == DS) 
			$dir = substr($dir, 0, -1);
			
		return $dir;
	}
	
	/**
	 * 级联创建目录
	 */
	static function make($dir, $mode = 0777)
	{
		$dir = self::setSafe($dir);
		if (file_exists($dir) && is_dir($dir)) 
			return true;
		
		///
		self::make(dirname($dir), $mode);
		
		if (mkdir($dir)) 
			return chmod($dir, $mode);
		
		return false;
	}
	
	/**
	 * 级联删除目录
	 */
	static function remove($dir)
	{
		$dir = self::setSafe($dir);
		if ($dir == '' || $dir == '/' || (strlen($dir) == 3 && substr($dir, 1) == ':\\')) 
			return false;
			
		if (!file_exists($dir)) 
			return true;
		
		///
		if ($handle = opendir($dir)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..') 
					continue;
				
				$fileAbs = $dir.DS.$file;
				if (is_dir($fileAbs)) {
					if (!self::remove($fileAbs)) 
						return false;
				} else 
					@unlink($fileAbs);
			}
			
			closedir($handle);
		}
		
		return rmdir($dir);
	}
	
	/**
	 * 取得某个目录的使用情况
	 */
	static function du($dir)
	{
		$dir = self::setSafe($dir);
		if (!is_dir($dir) || !is_readable($dir)) 
			return false;
			
		///
		$size = 0;
		if ($handle = opendir($dir)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..') 
					continue;
				
				$fileAbs = $dir.DS.$file;
				if (is_dir($fileAbs)) 
					$size += self::du($fileAbs);
				else
					$size += @filesize($fileAbs);
			}
			
			closedir($handle);
		}
		
		return $size;
	}
	
	/**
	 * 复制某个目录
	 */
	static function copy($source, $dest)
	{
		$source = self::setSafe($source);
		if (!is_dir($source) || !is_readable($source)) 
			return false;
		
		if (!file_exists($dest)) 
			mkdir($dest);
			
		///
		if ($handle = opendir($source)) {
			while (($file = readdir($handle)) !== false) {
				if ($file == '.' || $file == '..' || $file[0] == '.') 
					continue;
				
				$fileSource = $source.DS.$file;
				$fileDest = $dest.DS.$file;
				if (is_dir($fileSource)) 
					self::copy($fileSource, $fileDest);
				else
					copy($fileSource, $fileDest);
			}
			
			closedir($handle);
		}
		
		return true;
	}
}
